package String类;

/**·
 * @作者:侯国威
 * @时间: 2020/4/12/15:49
 * @邮箱:1045077189@qq.com String类表示字符串。 Java程序中的所有字符串文字（例如"abc" ）都实现为此类的实例。
 * 字符串是不变的; 它们的值在创建后无法更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的
 * 1、String：字符串声明为final的，不可以被继承；
 * 2、String实现了Interface Serializable(接口可序列化);interface Comparable<String>可比较的接口
 * 3、String：内部定义final char[] vlaue用于存储字符串数据
 * 4、通过字面量的方式给一个字符串赋值，此时字符串生命在字符串常量池中
 * 5、字符串常量池中不会存储相同的字符串。
 * 6、String代表不可变字符串重新赋值时。需要重新写指定区域赋值，不能使用原有的value
 * >当对现有的字符串进行比较时，需要重新分配内存空间
 * >当调用String的replace()方法修改指定字符时，需要重新写指定区域赋值，不能使用原有的value
 * String实例化的方式:
 * 1、通过字面量定义方式
 * 2、通过new+ 构造器方式
 * 面试题 String s3 = new String("java");方式创建时，内存中有几个对象
 * 两个:一个是常量池；一个是对空间new结构
 */
public class index {

    public static void main(String[] args) {
        index i1 = new index();
        i1.test1();
        i1.test2();
        i1.test3();
        i1.test4();
        i1.test5();
    }

    public void test1() {
        String s1 = "qwe";
        String s2 = "qwe";
        s1 = "abc";
        System.out.println(s1 == s2);//比较的是s1于s2的地址值,此时是false

        System.out.println(s1);//abc
        System.out.println(s2);//qwe

        System.out.println("---------------------");

        String s3 = "abc";
        s3 += "def";
        System.out.println(s3);//abcddef
        System.out.println("---------------------");
        String s4 = "abc";
        String s5 = s4.replace('a', 'A');//将某个位置上的字符替换
        System.out.println(s5);
    }

    public void test2() {
        /**
         *@作者:侯国威
         *@时间：2020/4/12_22:33
         *@描述:通过字面量定义方式：此时s1与s2的属于声明在方法区中的字符串常量中
         *
         */
        String s1 = "java";
        String s2 = "java";
        //通过new+ 构造器的防水:此时的s3和s4保存的地址值，十数据在对空间中开辟空间以后对应的地址值
        System.out.println("--------test2----------");
        String s3 = new String("java");
        String s4 = new String("java");
        System.out.println(s1 == s2);//true
        System.out.println(s3 == s4);//false 两个对象的地址值不一样的

        System.out.println(s1 == s3);//false
        System.out.println(s2 == s4);//false

    }

    public void test3() {
        /**
         *@作者:侯国威
         *@时间：2020/4/12_23:03
         *@描述:面试题：从底层去理解
         * 常量与常理拼接实在常量池中。且常量池中不会存在相同的常量
         * 只要其中有一个变量，结果就在堆中；
         * 如果拼接的就俄国调用intern()方法，返回值就在常量池中
         */
        String s1 = "abcd";
        String s2 = "efgh";
        String s3 = "abcdefgh";
        String s4 = "abcd" + "efgh";
        String s5 = s1 + "efgh";
        String s6 = s1 + s2;
        String s7 = "abcd" + s2;
        System.out.println("------------test3-------------");
        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s6 == s7);//false
        System.out.println(s4 == s7);//false

        String s8=s5.intern();//返回值得到的s8使用的常量值中已经存在的"....";
        System.out.println(s3 == s8);//true


    }

    public  void test4(){
        /**
        *@作者:侯国威
        *@时间：2020/4/12_23:26
        *@描述:
        */
        String s1="abcdefghijklmnopqrstuvwxyz";
        String s2="ABCDEFGH";
        String s3=s1.toUpperCase();//转为大写
        String s4=s2.toLowerCase();//转为小写
        String s5=s1.substring(1,7);//截取不包含截取的位置
        System.out.println("------------test4-------------");
        System.out.println(s1.length());
        System.out.println(s3);
        System.out.println(s4);
        System.out.println(s5);
        for (int i=0;i<s1.length();i++){
            //s1.charAt(value)返回某处的值
            if (i%2!=0){
                System.out.println(s1.charAt(i-1));
            }
        }

    }

    public void test5(){
        /**
        *@作者:侯国威
        *@时间：2020/4/12_23:51
        *@描述:String -->char[]之间的转换
         *调用String的toString方法
         *
         * char[]-->string:调用String构造器
        */
       String string ="123456789";
       String string1="";
        String string2="";
       char [] chararray=string.toCharArray();
       System.out.println("------------test5-------------");
       for (int i=0;i<chararray.length;i++){

           System.out.println(chararray[i]);
       }
       //--------------------------------------------


       char [] chars=new char[]{'h','o','u','g','u','o','w','e','i'};

       String s1= new String(chars);
       System.out.println(s1);
    //实现反转
       for (int i=chararray.length-1;i>=0;i--){

               string1+=chararray[i];


       }
        System.out.println("反转:"+string1);
    }


}
